package cn.itcast.web.controller.cargo;

import cn.itcast.domain.cargo.*;
import cn.itcast.service.cargo.ContractProductService;
import cn.itcast.service.cargo.FactoryService;
import cn.itcast.utils.ImageUploadUtils;
import cn.itcast.web.controller.BaseController;
import com.alibaba.dubbo.config.annotation.Reference;
import com.alibaba.excel.EasyExcel;
import com.github.pagehelper.PageInfo;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.springframework.stereotype.Controller;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

@Controller
@RequestMapping("/cargo/contractProduct")
public class ContractProductController extends BaseController {

    @Reference
    private ContractProductService contractProductService;

    @Reference
    private FactoryService factoryService;


    /**
     * 分页查询
     *  1、分页查询货物列表（根据勾选的合同id，查询货物）
     *      分页参数page，size
     *  2、查询生产厂家（查询所有ctype=“货物”的厂家）
     *  3、跳转页面
     * 参数：
     *  page，
     *  size
     *  contractId:购销合同id
     * 数据库表关系
     *  购销合同表（1方）
     *  货物表（多表） == contractId(购销合同id)
     */
    @RequestMapping("/list")
    public String list(
            @RequestParam(defaultValue = "1") int page,
            @RequestParam(defaultValue = "5") int size,
            String contractId) {
        //1、分页查询货物列表（根据勾选的合同id，查询货物）
        ContractProductExample cpe = new ContractProductExample();
        ContractProductExample.Criteria cc = cpe.createCriteria();
        cc.andContractIdEqualTo(contractId);
        PageInfo info = contractProductService.findAll(cpe, page, size);
        request.setAttribute("page", info);

        //2、查询生产厂家（查询所有ctype=“货物”的厂家）
        FactoryExample fe = new FactoryExample();
        FactoryExample.Criteria fc = fe.createCriteria();
        fc.andCtypeEqualTo("货物");
        List<Factory> list = factoryService.findAll(fe);
        request.setAttribute("factoryList",list);

        //3、为了保存方便，页面需要后台传递contractId
        request.setAttribute("contractId", contractId);

        return "cargo/product/product-list";
    }

    //进入到修改页面
    @RequestMapping("/toUpdate")
    public String toUpdate(String id) {
        //1、根据id查询货物
        ContractProduct contractProduct = contractProductService.findById(id);
        request.setAttribute("contractProduct",contractProduct);
        //2、查询所有的生产厂家
        FactoryExample fe = new FactoryExample();
        FactoryExample.Criteria fc = fe.createCriteria();
        fc.andCtypeEqualTo("货物");
        List<Factory> list = factoryService.findAll(fe);
        request.setAttribute("factoryList",list);
        return "cargo/product/product-update";
    }

    /**
     * 保存或者修改货物
     *  货物：包含一个contractId(外键)
     * 修改edit方法：
     *  完成图片上传
     *     java代码：
     *       1、文件解析器：未配置解析器（传递的对象属性为null）
     *       2、方法中通过MultipartFile描述文件对象，（参数名 = 页面的input的name属性）
     */
    @RequestMapping("/edit")
    public String edit(ContractProduct cp, MultipartFile productPhoto ) throws IOException {
        cp.setCompanyId(getLoginCompanyId());
        cp.setCompanyName(getLoginCompanyName());
        if(StringUtils.isEmpty(cp.getId())) {
            //保存，将图片上传到七牛云
            if(!productPhoto.isEmpty()) {
                String url = new ImageUploadUtils().upload(productPhoto.getBytes());
                System.out.println(url);
                cp.setProductImage(url);
            }
            contractProductService.save(cp);
        }else{
            contractProductService.update(cp);
        }
        return "redirect:/cargo/contractProduct/list.do?contractId="+cp.getContractId();
    }

    /**
     * 参数：
     *    id:货物id
     *   contractId:购销合同id（不会参与业务，页面跳转）
     */
    @RequestMapping("/delete")
    public String delete(String id,String contractId) {
        contractProductService.delete(id);
        return "redirect:/cargo/contractProduct/list.do?contractId="+contractId; //参数：购销合同id
    }

    /**
     * 进入上传的页面
     *  请求的连接：toImport
     *  参数：contractId
     */
    @RequestMapping("/toImport")
    public String toImport(String contractId) {
        request.setAttribute("contractId",contractId);
        return "cargo/product/product-import"; //参数：购销合同id
    }

    /**
     * 上传货物：
     *   请求连接：import.do
     *   参数：
     *    contractId:合同id
     *    file：上传的excel文件
     *  业务逻辑
     *    1、根据上传的excel文件，构造工作簿
     *    2、获取第一页
     *    3、从第二行开始循环获取每一行
     *    4、获取每一个单元格（1，2，3，4，5，6）
     *    5、每行中的数据，构造一个货物对象
     *    6、调用service完成保存
     */
//    @RequestMapping("/import")
//    public String importExcel(String contractId,MultipartFile file) throws IOException {
//        //i.解析Excel，获取数据
//        List<ContractProduct> list = new ArrayList();
//        //1.根据上传的file对象，构造出excel的工作簿
//        Workbook wb = new XSSFWorkbook(file.getInputStream());
//        //2.获取第一页
//        Sheet sheet = wb.getSheetAt(0);
//        //3.循环每一行（从第1行开始）
//        for(int i=1;i<=sheet.getLastRowNum();i++) {
//            //4.获取每一行对象
//            Row row = sheet.getRow(i);
//            //5.每一行的数据封装为货物对象ContractProduct对象
//            ContractProduct cp = new ContractProduct();
//            //6.获取行中的每一个单元格，获取单元格中的数据
//            String factoryName = row.getCell(1).getStringCellValue();
//            cp.setFactoryName(factoryName);
//            String productNo = row.getCell(2).getStringCellValue();
//            cp.setProductNo(productNo);
//            Integer cnumber = ((Double) row.getCell(3).getNumericCellValue()).intValue();//数量
//            cp.setCnumber(cnumber);
//            String packingUnit = row.getCell(4).getStringCellValue(); //包装单位
//            cp.setPackingUnit(packingUnit);
//            String loadingRate = row.getCell(5).getNumericCellValue() + ""; //装率
//            cp.setLoadingRate(loadingRate);
//            Integer boxNum = ((Double) row.getCell(6).getNumericCellValue()).intValue();//箱数
//            cp.setBoxNum(boxNum);
//            Double price = row.getCell(7).getNumericCellValue(); //单价
//            cp.setPrice(price);
//            String productDesc = row.getCell(8).getStringCellValue(); // 货物描述
//            cp.setProductDesc(productDesc);
//            String productRequest = row.getCell(9).getStringCellValue(); // 要求
//            cp.setProductRequest(productRequest);
//            //以上解析的都是excel中的内容，货物对象（购销合同，企业属性）
//            cp.setCompanyId(getLoginCompanyId());
//            cp.setCompanyName(getLoginCompanyName());
//            cp.setContractId(contractId); //合同id
//            list.add(cp);
//        }
//        //ii.经过解析之后，会获取到一个货物的list集合，调用service批量保存所有货物
//        contractProductService.saveAll(list);
//        return "redirect:/cargo/contractProduct/list.do?contractId="+contractId;
//    }

    /**
     * easyexcel完成文件解析
     *  1、封装java对象（在对象上配置注解）
     *     ContractProduct
     *     注解：配置表头（和文件表头要一模一样，才会自动识别数据）
     *  2、调用EaxyExcel的工具类，完成解析
     */
    @RequestMapping("/import")
    public String importExcel(String contractId,MultipartFile file) throws IOException {
        //读取excel获取list集合
        List<ContractProduct> list = EasyExcel.read(file.getInputStream()) //读取文件输入流
                .head(ContractProduct.class) //设置表头
                .sheet(0)
                .doReadSync();
        //设置基本属性
        for (ContractProduct cp : list) {
            cp.setCompanyId(getLoginCompanyId());
            cp.setCompanyName(getLoginCompanyName());
            cp.setContractId(contractId); //合同id
        }
        //调用service批量保存
        contractProductService.saveAll(list);
        return "redirect:/cargo/contractProduct/list.do?contractId="+contractId;
    }
}
